package com.example.service.impl;



import com.example.domain.pojo.Menu;
import com.example.domain.pojo.Permission;
import com.example.domain.pojo.Role;
import com.example.domain.pojo.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
 * 权限认证类
 * 对比密码,用户输入的密码和数据库中的密码进行比对
 * 赋权:角色,权限
 */
@Component  //相当于在xml文件中配置了bean
public class SpringSecurityUserService implements UserDetailsService {
    //使用dubbo通过网络远程调用服务提供方法获取数据库的用户信息
    @Autowired
    private UserService userService;

    //实现接口的方法 没有调用
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       //页面用户输入的用户名
        //1:根据提供的用户名查询数据库获取用户信息
//        System.out.println(username);
        User user= userService.findUser(username);//将角色查询出来
        //认证一:判断用户是否为空
        if(user==null){
            return null;//返回安全框架
        }
        //动态为用户授权
        //2:获取密码,将获取的密码提交
        String password = user.getPassword();

        //创建权限和角色的集合
        List<GrantedAuthority> list=new ArrayList<>();
        //3:获取权限,将封装权限的list集合返回

         //根据用户查角色,根据角色查菜单,根据角色查权限
        Set<Role> roles = user.getRoles();
        if(roles!=null&&roles.size()>0){
            //遍历封装角色的集合,为用户授予角色
            for (Role role : roles) {
                //授予角色
                list.add(new SimpleGrantedAuthority(role.getKeyword()));
                //遍历权限集合,为用户授予权限
                Set<Permission> permissions = role.getPermissions();
                if(permissions!=null&&permissions.size()>0){//为什么判断是否为空 TODO
                    for (Permission permission : permissions) {
                        list.add(new SimpleGrantedAuthority(permission.getKeyword()));
                    }
                }
               //* //取出菜单
                LinkedHashSet<Menu> menus = role.getMenus();
                if(menus!=null){
                    for (Menu menu : menus) {
                        list.add(new SimpleGrantedAuthority(menu.getLinkUrl()));
                    }
                }
            }
        }

        //认证二:根据页面获取输入的密码和数据库的进行比对
        //返回安全框架的user对象,将用户名和数据库的密码以及权限交给框架
        org.springframework.security.core.userdetails.User user1=new org.springframework.security.core.userdetails.User(username,user.getPassword(),list);
        return user1;
    }
}
